// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ui/views/debug_utils.h"

#include <ostream>

#include "base/logging.h"
#include "base/strings/utf_string_conversions.h"
#include "ui/views/view.h"

namespace views {
namespace {
    void PrintViewHierarchyImp(const View* view,
        int indent,
        std::wostringstream* out)
    {
        int ind = indent;
        while (ind-- > 0)
            *out << L' ';
        *out << base::UTF8ToWide(view->GetClassName());
        *out << L' ';
        *out << view->id();
        *out << L' ';
        *out << view->x() << L"," << view->y() << L",";
        *out << view->bounds().right() << L"," << view->bounds().bottom();
        *out << L' ';
        *out << view;
        *out << L'\n';

        for (int i = 0, count = view->child_count(); i < count; ++i)
            PrintViewHierarchyImp(view->child_at(i), indent + 2, out);
    }

    void PrintFocusHierarchyImp(const View* view,
        int indent,
        std::wostringstream* out)
    {
        int ind = indent;
        while (ind-- > 0)
            *out << L' ';
        *out << base::UTF8ToWide(view->GetClassName());
        *out << L' ';
        *out << view->id();
        *out << L' ';
        *out << view->GetClassName();
        *out << L' ';
        *out << view;
        *out << L'\n';

        if (view->child_count() > 0)
            PrintFocusHierarchyImp(view->child_at(0), indent + 2, out);

        const View* next_focusable = view->GetNextFocusableView();
        if (next_focusable)
            PrintFocusHierarchyImp(next_focusable, indent, out);
    }
} // namespace

void PrintViewHierarchy(const View* view)
{
    std::wostringstream out;
    out << L"View hierarchy:\n";
    PrintViewHierarchyImp(view, 0, &out);
    // Error so users in the field can generate and upload logs.
    LOG(ERROR) << out.str();
}

void PrintFocusHierarchy(const View* view)
{
    std::wostringstream out;
    out << L"Focus hierarchy:\n";
    PrintFocusHierarchyImp(view, 0, &out);
    // Error so users in the field can generate and upload logs.
    LOG(ERROR) << out.str();
}

} // namespace views
